/*
 * Copyright 2023, Haiku, Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 *
 * 龙芯3A6000 LS7A2000桥片 APIC中断控制器驱动
 * 参考Linux的loongson_pch_pic驱动实现
 */

#ifndef _LOONGSON_PCH_PIC_H
#define _LOONGSON_PCH_PIC_H

#include <KernelExport.h>
#include <PCI.h>
#include <SupportDefs.h>

// 寄存器定义
#define LS7A_PCH_PIC_INT_MASK_BASE 0x1440
#define LS7A_PCH_PIC_INT_EDGE_BASE 0x1480
#define LS7A_PCH_PIC_INT_CLEAR_BASE 0x14c0
#define LS7A_PCH_PIC_INT_STATUS_BASE 0x1500
#define LS7A_PCH_PIC_INT_POL_BASE 0x1540

// 中断控制器配置
#define LS7A_PCH_PIC_INT_ROUTE_BASE 0x1580
#define LS7A_PCH_PIC_INT_HTMSI_VEC_BASE 0x1680
#define LS7A_PCH_PIC_INT_BOUNCE_BASE 0x1700

// 中断数量定义
#define LS7A_PCH_PIC_MAX_PARENT_IRQS 4
#define LS7A_PCH_PIC_MAX_IRQS 64

// 中断路由模式
#define LS7A_PCH_PIC_ROUTE_DISABLE 0
#define LS7A_PCH_PIC_ROUTE_HTMSI 1
#define LS7A_PCH_PIC_ROUTE_EXTIOI 2

// 中断控制器结构体
typedef struct
{
    addr_t base_addr;                                // 寄存器基地址
    uint32 irq_base;                                 // 中断基础编号
    uint32 parent_irq[LS7A_PCH_PIC_MAX_PARENT_IRQS]; // 父中断编号
    uint32 route_mode;                               // 路由模式
    uint32 num_irqs;                                 // 中断数量
    uint32 irq_mask[LS7A_PCH_PIC_MAX_IRQS / 32];     // 中断掩码
} loongson_pch_pic;

// 函数声明
status_t loongson_pch_pic_init(addr_t base_addr, uint32 irq_base);
void loongson_pch_pic_uninit(void);

status_t loongson_pch_pic_enable_io_interrupt(uint32 irq);
status_t loongson_pch_pic_disable_io_interrupt(uint32 irq);
status_t loongson_pch_pic_configure_io_interrupt(uint32 irq, uint32 config);

// 中断处理函数
int32 loongson_pch_pic_handle_interrupt(void *data);

// 中断配置选项
#define LS7A_INT_LEVEL_TRIGGER 0
#define LS7A_INT_EDGE_TRIGGER 1
#define LS7A_INT_ACTIVE_HIGH 0
#define LS7A_INT_ACTIVE_LOW 1

#endif // _LOONGSON_PCH_PIC_H